package q829_consecutiveNumbersSum;

public class Solution_2 {
    /*
    针对该题的另一种解法
    此时我们考虑连续正整数的和的通项公式
    对于一个初始项为a 连续k个数的和是 a a+1 a+2 a+3 ... a+k-1 = (2a + k - 1) * k / 2
    那么就是(2a + k - 1) * k = 2n有解 所以首先要满足条件
    2n是k的倍数 并且2n/k - k = 2a - 1 而我们不关心2a - 1是什么 只关心2a-1是一个奇数 所以有(2n/i - i) % 2 != 0
    并且我们将i视作k 那么显然有i * i <= 2n时才能循环 否则就会超过了
    因此得到了计算方法
     */
    public int consecutiveNumbersSum(int n) {
        n *= 2;
        int res = 0;
        for (int i = 1; i * i <= n; ++i) {
            if (n % i == 0 && (n/i - i) % 2 != 0) res++;
        }

        return res;
    }
}
